import re
import mechanize
import mimetypes
import sys
import os
import getpass
from optparse import OptionParser
from CompressURL import Compress

#  _____ _____ _   _             _                    _ 
# |  ___| ____| | | |_ __  _   _| |    ___   __ _  __| |
# | |_  |  _| | | | | '_ \| | | | |   / _ \ / _` |/ _` |
# |  _| | |___| |_| | |_) | |_| | |__| (_) | (_| | (_| |
# |_|   |_____|\___/| .__/ \__, |_____\___/ \__,_|\__,_|
#                   |_|    |___/                        

#     .--. 
#    |o_o | 
#    |:_/ | 
#   //   \ \ 
#  (|     | ) 
# /'\_   _/`\ 
# \___)=(___/ 


class Client:
	def __init__(self, url):
		"""Inicializia o cliente e abre automaticamente a pagina principal
		do site.
		"""
		self.browser = mechanize.Browser()
		self.LINK = url
		self.browser.open(url)
		self.TITLE = self.browser.title()
		# Se o metodo login conseguir efectuar o login sem qualquer problemas
		# este atributo tera o valor True.
		# Desta forma, o enviarFicheiro podera verificar se pode ou nao enviar
		# os ficheiros pedidos
		self.sucess_login = False

	def login(self, username, password):
		"""Efectua o login no site.
		Se o login for efectuado com sucesso, devolve True, caso contrario
		devolve False.
		"""
		self.browser.select_form(nr=0)
		self.browser["user[username]"] = username
		self.browser["user[password]"] = password
		self.browser.submit()
		
		if self.TITLE != self.browser.title():
			self.sucess_login = True
			return True
		else:
			return False

	def enviarFicheiro(self, nomeficheiro):
		"""Recebe o caminho completo para o ficheiro a enviar.
		Devolve False se o utilizador nao se encontra registado no site, caso
		contrario, devolve o link para o ficheiro que foi enviado.
		"""
		if not self.sucess_login:
			return False
			
		ficheiro = open(nomeficheiro)
		
		# O mimetype e necessario para o servidor saber qual o tipo de ficheiro
		# que estamos a fazer upload
		mime = mimetypes.guess_type(nomeficheiro)[0]
		
		self.browser.select_form(nr=0)
		self.browser.form.add_file(ficheiro, mime, nomeficheiro)
		self.browser.submit()
		
		# Encontrar o link do ficheiro que acabou de ser enviado
		for link in self.browser.links():
			if link.text == self._obter_filename(nomeficheiro):
				return self.LINK + link.url

	def _obter_filename(self, nomeficheiro):
		"""Devolve a parte final do argumentos "nomeficheiro".
		"""

		return nomeficheiro.split(os.path.sep)[-1]
	

def argvParser():
	"""Devolve uma "classe" que permite aceder ao username, password e filename
	necessarios para o funcionamento do programa.
	
	Se o utilizador nao tiver passado a sua password na linha de comandos
	pedimos para ele a inserir, usando o modulo getpass.
	"""
	parser = OptionParser()
	parser.add_option("-f", "--file", action="store", dest="filename", help="Nome do Ficheiro", metavar="FILE")
	parser.add_option("-u", "--username", action="store", dest="username", help="Username do SIFEUP")
	parser.add_option("-p", "--password", action="store", dest="password", help="Password do SIFEUP")
	parser.add_option("-c", "--compress", action="store", dest="compress", help="Comprimir URL no http://is.gd")
	
	(options, args) = parser.parse_args()
	
	# Pode haver quem nao queira mandar as password em plaintext na linha
	# de comandos
	if not options.password and options.filename and options.username:
		options.password = getpass.getpass("Por favor insira a password: ")
		
	return options

if __name__ == "__main__":
	argumentos = argvParser()

	if not  argumentos.filename:
		print "POR FAVOR, ENVIE UM FICHEIRO. Para ajuda faca -h ou --help"
	else:

		client = Client("http://feupload.fe.up.pt")
	
		print "A FAZER LOGIN..."
		if argumentos.username:
			if client.login(argumentos.username, argumentos.password):
				print "LOGIN OK, A ENVIAR FICHEIRO..."
				link = client.enviarFicheiro(argumentos.filename)
				if argumentos.compress == "y":
					link = Compress(link)
				print "FICHEIRO ENVIADO PARA: " + link
		else:
			print "O LOGIN FALHOU! USERNAME E/OU PASSWORD ERRADOS?"
